Cosmos SDK (SDKアプリケーションの構造)
Cosmos SDKの内部構造が知りたいので、ドキュメントを読んでます。
ここでは、実際にアプリケーションを使うときに実装するメソッドではなく、そのときに参照するコアなパーツを解説
baseapp
ABCIやルーティングロジックを実装している
つまり、Cosmos SDKの核
カスタムアプリケーション(カスタムブロックチェーン)を作るにはこのbaseappの概念を利用することになる
app.go
ステートマシンのインスタンスを定義するファイル
アプリケーションの型定義や初期化の関数などが書かれる
一般的にbaseappを拡張したカスタムアプリケーションとして定義する
multistore
全体のステートを格納するストア
各モジュールはmultistoreを利用してステートの一部を永続化する
Keeper
各モジュールはKeeperを用いて抽象化され、モジュールの書き込み・読み込みを処理する
他のモジュールからKeeperのメソッドを呼び出すことも可能
appCode
データ構造を保存するためのシリアル化とデシリアライズに使用する
Module
TendermintエンジンからABCIを経由してアプリケーションにトランザクションが送られてくると、baseappによって適切なモジュールにルーティングされ、処理される
各モジュールには、メッセージを処理するMsgサービスと、クエリを処理するgRPC Queryサービスの2つのProtobufサービスが定義されています
Msgサービス
Msg サービスは、モジュールが公開するすべての可能な Msgs を定義する Protobuf サービスです。
モジュール開発者は、独自のモジュールを構築する際にカスタムMsgを作成します。
Msgサービスで処理→Keeperを呼び出してステートを更新
gRPC Queryサービス
ユーザーがgRPCを使用して状態を照会することができます。
モジュールはCosmos SDKで定義されている以下の二つのインターフェースを実装する必要がある
AppModuleBasic
コーデックのようなモジュールの基本的な非依存要素を実装
AppModule
モジュールメソッドの大部分(他のモジュールのキーパーへの参照を必要とするメソッドを含む)を処理
Module maneger
アプリケーションのモジュールのリストを格納するオブジェクト
モジュール間の実行順序やメソッド利用の許可を用意にする
アプリケーション内のトークン総発行量などはここで登録される
InitChainer
アプリケーションの初期化つまり、ブロックチェーンのgenesis blockを定義
アプリケーションがTendermintエンジンからInitChainメッセージを得た時に呼び出される関数
この設定はmust
Register Codec
アプリ全体で使用されるコーデックを定義する場所
Keeper
位置付けとしては、モジュールのストアを読み書きするための「ゴールキーパー」
ストアのキーを持っているオブジェクトだけがそれにアクセスでき、モジュールのキーパーだけがモジュールのストアのキーを持っていなければなりません。